/**
  ******************************************************************************
  * @file    spi.c
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-03-14
  * @brief   spi驱动,适用于PIC16(L)F1788_9
  *
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

#ifndef __SPI_H
#define __SPI_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "common.h"

/* 宏定义---------------------------------------------------------------------*/

#define SPI_CMD(x)                          (SSPEN = (x)) /* SPI开关 */
    
/* spi_mode spi模式选择 */
#define SPI_MODE_MASTER_4                   (0x0) /* 主模式,时钟=Fosc/4 */
#define SPI_MODE_MASTER_16                  (0x1) /* 主模式,时钟=Fosc/16 */
#define SPI_MODE_MASTER_64                  (0x2) /* 主模式,时钟=Fosc/64 */
#define SPI_MODE_MASTER_TMR2                (0x3) /* 主模式,时钟=TMR2输出/2 */
#define SPI_MODE_SLAVE_CS                   (0x4) /* 从模式,时钟=SCK引脚,使能CS引脚控制 */
#define SPI_MODE_SLAVE                      (0x5) /* 从模式,时钟=SCK引脚,禁止CS引脚控制,可用作IO */
#define SPI_MODE_MASTER                     (0xA) /* 主模式,时钟=Fosc/(4*(SSPADD+1)) */
/* spi_cpol spi时钟极性选择 */
#define SPI_CPOL_0                          (0x0) /* 时钟低电平为空闲 */
#define SPI_CPOL_1                          (0x1) /* 时钟高电平为空闲 */
/* spi_cpha spi时钟相位选择 */
#define SPI_CPHA_0                          (0x0) /* 时钟从空闲转到有效时发送(第一个跳变沿发送) */
#define SPI_CPHA_1                          (0x1) /* 时钟从有效转到空闲时发送(第二个跳变沿发送) */
    
/* 类型定义-------------------------------------------------------------------*/
typedef struct spi_config {
    uint8_t mode : 4; /* SPI模式 @ref spi_mode */
    uint8_t cpol : 2; /* 时钟极性 @ref spi_cpol */
    uint8_t cpha : 2; /* 时钟相位 @ref spi_cpha */
    uint8_t freqDiv; /* 时钟分频 2~255 仅在模式为SPI_MODE_MASTER时可用 */
} spi_config_t;

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
void spi_init(spi_config_t config);
uint8_t spi_rw(uint8_t byte);

#ifdef __cplusplus
}
#endif

#endif /* spi.h */